package pers.amos.eshop.data.link.web.controller;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.log.StaticLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import pers.amos.eshop.data.link.redis.RedisUtils;
import pers.amos.eshop.data.link.service.EshopProductService;

/**
 * @author amos wong
 * @create 2020-12-17 7:17 下午
 */
@RestController
public class EshopDataLinkController {

    @Autowired
    private EshopProductService eshopProductService;

    @Autowired
    private RedisUtils redisUtils;

    private static final String DIM_PRODUCT_PREFIX = "dim_product_";

    /**
     * 数据直连服务获取商品完整信息的接口
     *
     * 1.从本地缓存 ehcache 中尝试获取完整缓存 （这里不做了太 easy）
     * 2.尝试从 redis 主集群获取商品数据
     * 3.通过 feign 发送 Http 请求，去依赖服务获取商品信息 然后组装在一起
     * 再将数据写入到 redis 主集群，同时将数据返回给 nginx
     *
     * @param productId 商品id
     * @return 返回主集群中查询到的/刚生成的商品完整数据
     */
    @GetMapping("/product")
    public String getProduct(Long productId) {
        // 查询缓存主集群
        String dimProduct = redisUtils.get(DIM_PRODUCT_PREFIX + productId);
        if (StrUtil.isBlank(dimProduct)) {
            JSONObject jsonObject = new JSONObject();

            // 远程调用依赖服务
            String product = eshopProductService.findProductById(productId);
            if (StrUtil.isNotBlank(product)) {
                jsonObject.set("product", product);
            }

            String productProperty = eshopProductService.findProductPropertyByProductId(productId);
            if (StrUtil.isNotBlank(productProperty)) {
                jsonObject.set("productProperty", productProperty);
            }

            String productSpecification = eshopProductService.findProductSpecificationByProductId(productId);
            if (StrUtil.isNotBlank(productSpecification)) {
                jsonObject.set("productSpecification", productSpecification);
            }

            redisUtils.set(DIM_PRODUCT_PREFIX + productId, jsonObject.toString());

            StaticLog.info("【数据直连服务】新增商品缓存成功，product = {}", jsonObject.toString());
            return jsonObject.toString();
        }

        StaticLog.info("【数据直连服务】成功查询商品缓存信息，product = {}", dimProduct);

        return dimProduct;
    }
}
